package com.cloud.springcloudhysyrix.consumer;

import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixObservableCommand;
import org.springframework.web.client.RestTemplate;
import rx.Observable;
import rx.Subscriber;

/**
 *
 * 方式三：
 *  观察着模式，来完成
 *
 *  使用场景：我调用了一个方法，只能返回一个String类型。但是我要求返回多个记录进行汇总，那么这个方式的就可以解决这个问题。
 *
 * weiximei on 2018/5/6
 */
public class HelloServiceObserveCommand extends HystrixObservableCommand<String> {

    private RestTemplate restTemplate;

    public HelloServiceObserveCommand(String commandGroupKeyGroup,RestTemplate restTemplate) {
        super(HystrixCommandGroupKey.Factory.asKey(commandGroupKeyGroup));
        this.restTemplate = restTemplate;
    }

    @Override
    protected Observable<String> construct() {
        // 观察者模式，观察一个什么样的事件
        // 创建一个事件
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                /**
                 * 如果把结果汇总的时候，出现了错误，就需要try一下，并且返回错误
                 */
                try {
                    if (!subscriber.isUnsubscribed()){
                        String result = restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
                        // 把结果返回出去
                        subscriber.onNext(result);

                        String result1 = restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
                        // 把结果返回出去
                        subscriber.onNext(result1);

                        // 等上面的请求都拿到结果后，我在把这些数据一次放回出去
                        subscriber.onCompleted();
                    }
                } catch (Exception e) {
                    // 如果发生错误就把错误返回出去
                    subscriber.onError(e);
                }

            }
        });
    }

    /**
     * 这个方法相当于 Fallback 服务降级
     * @return
     */
    @Override
    protected Observable<String> resumeWithFallback() {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    if (!subscriber.isUnsubscribed()){
                        subscriber.onNext("error");
                        subscriber.onCompleted();
                    }
                }catch (Exception e){
                    subscriber.onError(e);
                }
            }
        });
    }
}
